home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / PROGS / advanced97 / genspheremap.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  6.9 KB  |  292 lines

  1. #include <assert.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "texture.h"
  7.  
  8. /* Some <math.h> files do not define M_PI... */
  9. #ifndef M_PI
  10. #define M_PI 3.14159265358979323846
  11. #endif
  12.  
  13. #ifdef _WIN32
  14. #include <windows.h>
  15. #define sleep(x) Sleep((x*1000))
  16. #else
  17. #include <unistd.h>
  18. #endif
  19.  
  20. #include <GL/glut.h>
  21.  
  22. const char defaultBaseName[] = "data/small";
  23.  
  24. GLuint *faces[6];
  25. GLsizei faceW[6], faceH[6];
  26.  
  27. GLfloat angle1[6] = {90, 180, 270, 0, 90, -90};
  28. GLfloat axis1[6][3] = {{0,1,0}, {0,1,0}, {0,1,0}, {0,1,0}, {1,0,0}, {1,0,0}};
  29. GLfloat angle2[6] = {0, 0, 0, 0, 180, 180};
  30. GLfloat axis2[6][3] = {{0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {0,1,0}, {0,1,0}};
  31.  
  32. GLuint *load_texture(const char *fname, GLsizei *w, GLsizei *h)
  33. {
  34.     int comps;
  35.     GLuint *img;
  36.     int i;
  37.  
  38.     img = read_texture(fname, w, h, &comps);
  39.     if (!img) {
  40.     fprintf(stderr, "Could not open %s\n", fname);
  41.     exit(1);
  42.     }
  43.  
  44.     for (i = 0; i < *w * *h; i++) {
  45.     img[i] |= 0xff;
  46.     }
  47.  
  48.     return img;
  49. }
  50.  
  51. void set_texture_border(GLuint val, GLuint mask, 
  52.             GLsizei w, GLsizei h, GLuint *pix)
  53. {
  54.     int x, y;
  55.  
  56.     val &= mask;
  57.     mask = ~mask;
  58.  
  59.     /* top & bottom rows */
  60.     for (x = 0; x < w; x++) {
  61.     pix[x] = (pix[x] & mask) | val;
  62.     pix[x + (h-1)*w] = (pix[x + (h-1)*w] & mask) | val;
  63.     }
  64.  
  65.     for (y = 0; y < h; y++) {
  66.     pix[y*w] = (pix[y*w] & mask) | val;
  67.     pix[y*w + (w-1)] = (pix[y*w + (w-1)] & mask) | val;
  68.     }
  69. }
  70.  
  71. void init(void)
  72. {
  73.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  74.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  75. }
  76.  
  77. void reshape(GLsizei w, GLsizei h) 
  78. {
  79.     glViewport(0, 0, w, h);
  80.     glLoadIdentity();
  81.     glOrtho(-2, 2, -2, 2, 0, 5);
  82. }
  83.  
  84. void draw_special_sphere(int tess)
  85. {
  86.     float r = 1.0, r1, r2, z1, z2;
  87.     float theta, phi;
  88.     int nlon = tess, nlat = tess;
  89.     int i, j;
  90.  
  91.     glBegin(GL_TRIANGLE_FAN);
  92.     theta = M_PI*1.0/nlat;
  93.     r2 = r*sin(theta); z2 = r*cos(theta);
  94.     glNormal3f(0.0, 0.0, 1.0);
  95.     glVertex4f(0.0, 0.0, r*r, r);
  96.     for (j = 0, phi = 0.0; j <= nlon; j++, phi = 2*M_PI*j/nlon) {
  97.     glNormal3f(r2*cos(phi), r2*sin(phi), z2);
  98.     glVertex4f(r2*cos(phi)*z2, r2*sin(phi)*z2, z2*z2, z2); /* top */
  99.     }
  100.     glEnd();
  101.  
  102.     for (i = 2; i < nlat; i++) {
  103.     theta = M_PI*i/nlat;
  104.     r1 = r*sin(M_PI*(i-1)/nlat); z1 = r*cos(M_PI*(i-1)/nlat);
  105.     r2 = r*sin(theta); z2 = r*cos(theta);
  106.  
  107.     if (fabs(z1) < 0.01 || fabs(z2) < 0.01)
  108.         break;
  109.  
  110.     glBegin(GL_QUAD_STRIP);
  111.     for (j = 0, phi = 0; j <= nlat; j++, phi = 2*M_PI*j/nlon) {
  112.         glNormal3f(r1*cos(phi), r1*sin(phi), z1);
  113.         glVertex4f(r1*cos(phi)*z1, r1*sin(phi)*z1, z1*z1, z1);
  114.         glNormal3f(r2*cos(phi), r2*sin(phi), z2);
  115.         glVertex4f(r2*cos(phi)*z2, r2*sin(phi)*z2, z2*z2, z2);
  116.     }
  117.     glEnd();
  118.     }
  119. }
  120.  
  121. void render_spheremap(int width, int height)
  122. {
  123.     GLfloat p[4];
  124.     int i;
  125.  
  126.     glColor4f(1, 1, 1, 1);
  127.  
  128.     glEnable(GL_TEXTURE_2D);
  129.  
  130.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  131.  
  132.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  133.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  134.  
  135.     glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  136.  
  137.     p[0] = 2.0; p[1] = p[2] = p[3] = 0.0; /* 2zx */
  138.     glTexGenfv(GL_S, GL_OBJECT_PLANE, p);
  139.   
  140.     glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  141.     p[0] = 0.0; p[1] = 2.0; p[2] = p[3] = 0.0; /* 2zy */
  142.     glTexGenfv(GL_T, GL_OBJECT_PLANE, p);
  143.   
  144.     glTexGenf(GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  145.     p[0] = p[1] = 0.0; p[2] = 0.0; p[3] = 2.0; /* 2z */
  146.     glTexGenfv(GL_R, GL_OBJECT_PLANE, p);
  147.  
  148.     glEnable(GL_TEXTURE_GEN_S);
  149.     glEnable(GL_TEXTURE_GEN_T);
  150.     glEnable(GL_TEXTURE_GEN_R);
  151.   
  152.     glMatrixMode(GL_PROJECTION);
  153.     glPushMatrix();
  154.     glMatrixMode(GL_MODELVIEW);
  155.     glPushMatrix();
  156.     glMatrixMode(GL_TEXTURE);
  157.     glPushMatrix();
  158.  
  159.     glMatrixMode(GL_PROJECTION);
  160.     glLoadIdentity();
  161.     glOrtho(-1, 1, -1, 1, 1.0, 100);
  162.     glMatrixMode(GL_MODELVIEW);
  163.     glLoadIdentity();
  164.     gluLookAt(0, 0, 6,
  165.           0, 0, 0,
  166.           0, 1, 0);
  167.  
  168.     glEnable(GL_DEPTH_TEST);
  169.     glEnable(GL_CULL_FACE);
  170.  
  171.     glEnable(GL_BLEND);
  172.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  173.  
  174.     glClearColor(0.0, 0.0, 0.0, 1.0);
  175.     glClearDepth(1.0);
  176.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  177.  
  178.     for (i = 0; i < 6; i++) {
  179.     glTexImage2D(GL_TEXTURE_2D, 0, 4, faceW[i], faceH[i], 0, 
  180.              GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)faces[i]);
  181.  
  182.     glMatrixMode(GL_TEXTURE);
  183.     glLoadIdentity();
  184.     glScalef(0.5, 0.5, 1.0);
  185.     glTranslatef(1.0, 1.0, 0.0);
  186.     glFrustum(-1.01, 1.01, -1.01, 1.01, 1.0, 100.0);
  187.     if (angle2[i]) {
  188.         glRotatef(angle2[i], axis2[i][0], axis2[i][1], axis2[i][2]);
  189.     }
  190.     glRotatef(angle1[i], axis1[i][0], axis1[i][1], axis1[i][2]);
  191.     
  192.     /* XXX atul does another angle thing here... */
  193.     /* XXX atul does a third angle thing here... */
  194.     
  195.     glTranslatef(0.0, 0.0, -1.00);
  196.     
  197.     glMatrixMode(GL_MODELVIEW);
  198.     glClear(GL_DEPTH_BUFFER_BIT);
  199.     draw_special_sphere(20);
  200.  
  201.     sleep(1);
  202.     }
  203.  
  204.     glDisable(GL_BLEND);
  205.     glDisable(GL_CULL_FACE);
  206.  
  207.     glMatrixMode(GL_PROJECTION);
  208.     glPopMatrix();
  209.     glMatrixMode(GL_MODELVIEW);
  210.     glPopMatrix();
  211.     glMatrixMode(GL_TEXTURE);
  212.     glPopMatrix();
  213.  
  214.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  215.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  216.  
  217.     glDisable(GL_TEXTURE_GEN_S);
  218.     glDisable(GL_TEXTURE_GEN_T);
  219.     glDisable(GL_TEXTURE_GEN_R);
  220.  
  221.     glDisable(GL_TEXTURE_2D);
  222. }
  223.  
  224. void draw(void)
  225. {
  226.     GLenum err;
  227.  
  228.     glClear(GL_COLOR_BUFFER_BIT);
  229.  
  230.     render_spheremap(256, 256);
  231.  
  232.     err = glGetError();
  233.     if (err != GL_NO_ERROR) printf("Error:  %s\n", gluErrorString(err));
  234. }
  235.  
  236. /* ARGSUSED1 */
  237. void key(unsigned char key, int x, int y)
  238. {
  239.     if (key == 27) exit(0);
  240. }
  241.  
  242. void show_usage(void)
  243. {
  244.     fprintf(stderr, "Usage:\n");
  245.     fprintf(stderr, "genspheremap -- use default files"
  246.         "(%s0.rgb through %s5.rgb)\n", defaultBaseName, defaultBaseName);
  247.     fprintf(stderr, "genspheremap baseName -- use files of the form "
  248.         "baseName0.rgb through baseName5.rgb\n");
  249.     fprintf(stderr, "genspheremap f0.rgb f1.rgb f2.rgb f3.rgb f4.rgb f5.rgb\n");
  250. }
  251.  
  252. main(int argc, char *argv[])
  253. {
  254.     const char *baseName;
  255.     char fname[128];
  256.     int i;
  257.  
  258.     glutInitWindowSize(512, 512);
  259.     glutInitWindowPosition(0, 0);
  260.     glutInit(&argc, argv);
  261.     glutInitDisplayMode(GLUT_RGB);
  262.     glutCreateWindow(argv[0]);
  263.     glutDisplayFunc(draw);
  264.     glutKeyboardFunc(key);
  265.     glutReshapeFunc(reshape);
  266.     init();
  267.  
  268.     if (argc == 1 || argc == 2) {
  269.     if (argc == 1) baseName = defaultBaseName;
  270.     else baseName = argv[1];
  271.     assert(strlen(baseName) < 128 - (strlen("0.rgb") + 1));
  272.     for (i = 0; i < 6; i++) {
  273.         sprintf(fname, "%s%d.rgb", baseName, i);
  274.         faces[i] = load_texture(fname, &faceW[i], &faceH[i]);
  275.     }
  276.     } else if (argc == 7) {
  277.     for (i = 0; i < 6; i++) {
  278.         faces[i] = load_texture(fname, &faceW[i], &faceH[i]);
  279.     }
  280.     } else {
  281.     show_usage();
  282.     exit(1);
  283.     }
  284.   
  285.     for (i = 0; i < 6; i++) {
  286.     set_texture_border(0x00, 0xff, faceW[i], faceH[i], faces[i]);
  287.     }
  288.   
  289.     glutMainLoop();
  290.     return 0;
  291. }
  292.